package org.deegree.igeo.views.swing.print; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import java.io.FileOutputStream; import javax.print.Doc; import javax.print.DocFlavor; import javax.print.DocPrintJob; import javax.print.PrintService; import javax.print.PrintServiceLookup; import javax.print.SimpleDoc; import javax.print.StreamPrintService; import javax.print.StreamPrintServiceFactory; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.PrintRequestAttributeSet; import javax.swing.SwingUtilities; import org.deegree.framework.log.ILogger; import org.deegree.framework.log.LoggerFactory; import org.deegree.igeo.mapmodel.MapModel; /** * * TODO add class documentation here * * @author <a href="mailto:name@deegree.org">Andreas Poth</a> * @author last edited by: $Author$ * * @version $Revision$, $Date$ */ public class DirectPrinter { private static final ILogger LOG = LoggerFactory.getLogger( DirectPrinter.class ); private MapModel mapModel; /** * * @param mapModel */ public DirectPrinter( MapModel mapModel ) { this.mapModel = mapModel; } /** * prints map onto a printer device */ public void print() { final String sCrLf = System.getProperty( "line.separator" ); final String sPrintFile = "PrintFile.ps"; final String sErrNoPrintService = sCrLf + "Es ist kein passender Print-Service installiert."; // Commandline parameter: int idxPrintService = -1; // -1 means: no parameter // Set DocFlavor and print attributes: DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE; final PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); //aset.add( MediaSizeName.ISO_A4 ); try { if ( -2 == idxPrintService ) { // Print to Stream (here to PostScript File): StreamPrintServiceFactory[] prservFactories = StreamPrintServiceFactory.lookupStreamPrintServiceFactories( flavor, DocFlavor.BYTE_ARRAY.POSTSCRIPT.getMimeType() ); if ( null == prservFactories || 0 >= prservFactories.length ) { LOG.logError( sErrNoPrintService ); return; } LOG.logInfo( "Stream-PrintService-Factory:" ); for ( int i = prservFactories.length - 1; i >= 0; i-- ) { LOG.logInfo( " " + prservFactories[i] + " (" + prservFactories[i].getOutputFormat() + ")" ); } FileOutputStream fos = new FileOutputStream( sPrintFile ); StreamPrintService sps = prservFactories[0].getPrintService( fos ); LOG.logInfo( "Stream-PrintService:" ); LOG.logInfo( " " + sps + " (" + sps.getOutputFormat() + ")" ); DocPrintJob pj = sps.createPrintJob(); Doc doc = new SimpleDoc( new PrintableMap( mapModel ), flavor, null ); pj.print( doc, aset ); fos.close(); LOG.logInfo( "Ausgabedatei '" + sPrintFile + "' ist erfolgreich generiert." ); } else { // Print to PrintService (e.g. to Printer): PrintService prservDflt = PrintServiceLookup.lookupDefaultPrintService(); PrintService[] prservices = PrintServiceLookup.lookupPrintServices( flavor, aset ); if ( null == prservices || 0 >= prservices.length ) if ( null != prservDflt ) { LOG.logWarning( "Nur Default-Printer, da lookupPrintServices fehlgeschlagen. " ); prservices = new PrintService[] { prservDflt }; } else { LOG.logError( sErrNoPrintService ); return; } if ( LOG.getLevel() == ILogger.LOG_DEBUG ) { for ( int i = 0; i < prservices.length; i++ ) { LOG.logDebug( "Print-Services:" ); LOG.logDebug( " " + i + ": " + prservices[i] + ( ( prservDflt != prservices[i] ) ? "" : " (Default)" ) ); } } final PrinterJob pjob = PrinterJob.getPrinterJob(); pjob.setPrintService( prservDflt ); if ( pjob.printDialog() ) { // pjob.setPrintable( new PrintableMap( mapModel ), pjob.pageDialog( aset ) ); pjob.setPrintable( new PrintableMap( mapModel ) ); SwingUtilities.invokeLater( new Runnable() { public void run() { try { pjob.print( aset ); } catch ( PrinterException e ) { LOG.logError( e ); } } } ); } } } catch ( Exception pe ) { LOG.logError( pe ); } } }